package tab;

import javax.swing.*;
import javax.swing.plaf.basic.BasicButtonUI;
import java.awt.*;
import java.awt.event.*;


public class ButtonTabComponent extends JPanel {

    private final JTabbedPane pane;

    public ButtonTabComponent(final JTabbedPane pane, boolean close) {
        //设置标签头要水平的，从左向右的排列组件，并且组件的间距为0（横向和纵向）
        super(new FlowLayout(FlowLayout.LEFT, 0, 0));
        if (pane == null)
            throw new NullPointerException("pane can not be null");
        this.pane = pane;
        //不画出panel的边界
        setOpaque(false);
        //创建标签头的文字内容
        JLabel label = new JLabel() {
            //重写方法，返回pane指定位置的名字，这里有点绕，可以好好理解理解
            //为什么不直接设置标签的内容，而是通过重写函数来修改标签内容
            //是希望业务逻辑尽量不要散落在外部
            @Override
            public String getText() {
                //可以获得当前panel在tab中的位置
                int i = pane.indexOfTabComponent(ButtonTabComponent.this);
                if (i != -1)
                    //得到当前panel的名字（实际是tab的名字）
                    return pane.getTitleAt(i);
                return null;
            }
        };
        label.setHorizontalAlignment(SwingConstants.CENTER);
        label.setBorder(BorderFactory.createEmptyBorder(0, 0, 0, close ? 5 : 0));
        // 修改标签tab的宽度 
        label.setPreferredSize(new Dimension(close ? 125 : 20, 20));
        add(label);
        if (close) {
            //创建关闭按钮（就是那个X按键）
            JButton button = new TabButton();
            add(button);
            setBorder(BorderFactory.createEmptyBorder(2, 0, 0, 0));
        }
        label.setFont(new Font("微软雅黑", close ? Font.PLAIN : Font.BOLD, close ? 12 : 20));
    }

    private class TabButton extends JButton implements ActionListener {
        public TabButton() {
            //设置按键的大小
            final int size = 18;
            setPreferredSize(new Dimension(size, size));
            //设置按键的提示信息
            setToolTipText("关闭窗口");
            //设置按键的绘制于普通按键相同
            setUI(new BasicButtonUI());
            //不对Button进行填充，就是按键是透明的
            setContentAreaFilled(false);
            //按键不能获得焦点
            setFocusable(false);
            //设置按键的边框为雕刻样式
            setBorder(BorderFactory.createEtchedBorder());
            //系统不自动绘制按键边界（这个边界在鼠标放上去之后才绘制）
            setBorderPainted(false);
            //添加按键点击事件
            addActionListener(TabButton.this);
            //添加鼠标事件（主要是mouseover 和 mouse exit）
            //addMouseListener(mouseListener);
        }

        //重写Button的绘制函数
        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            //创建一个graphics2D，因为需要在Button上画差
            Graphics2D g2 = (Graphics2D) g.create();
            //设置画笔，宽度为2
            g2.setStroke(new BasicStroke(2));
            //设置画笔颜色
            g2.setColor(Color.BLACK);
            //当鼠标移动到Button上时，画笔为白色，背景为红色 ； 离开button时为透明
            if (getModel().isRollover()){
            	g2.setColor(Color.WHITE);
            	this.setContentAreaFilled(true);
            	this.setBackground(Color.RED);
            } else {
            	this.setContentAreaFilled(false);
            }
                
            //绘制差
            int delta = 6;
            g2.drawLine(delta, delta, getWidth() - delta - 1, getHeight() - delta - 1);
            g2.drawLine(getWidth() - delta - 1, delta, delta, getHeight() - delta - 1);
            //释放画笔资源
            g2.dispose();
        }

        @Override
        public void actionPerformed(ActionEvent arg0) {
            int i = pane.indexOfTabComponent(ButtonTabComponent.this);
            if (i != -1) {
                try {
                    // 正确清理游戏进程资源
                    Process process = tab.Main.tabJFrame.getGames().remove(i);
                    if (process != null && process.isAlive()) {
                        process.destroyForcibly(); // 强制终止进程
                    }

                    // 正确移除标签页
                    pane.remove(i);
                    TabJFrame.tabCount--;

                    // 如果还有其他标签页，选择第一个
                    if (pane.getTabCount() > 0) {
                        pane.setSelectedIndex(0);
                    }
                } catch (Exception e) {
                    // 记录异常但不中断操作
                    e.printStackTrace();
                }
            }
        }
    }
}